Google Cloud の Buildpacks を触ってみました
こんにちは、川田です。今回は Google Cloud 側で提供されている Buildpacks を利用して、簡単なコンテナをビルドしてみました。本投稿は、その作業ログ的なものとなっています。
環境
- Google Cloud SDK 432.0.0
Buildpacks とは
Dockerfile を作成せずに、コンテナイメージを作れてしまう、というものになります。
Google Cloud の Buildpack は、アプリケーションのソースコードを取得して本番環境に対応したコンテナ イメージに変換するオープンソース プロジェクトです。Google Cloud で公開される Buildpack は、Cloud Native Buildpack の仕様を実装し、Google Cloud にデプロイ可能なコンテナをビルドして構成するように設計されています。
Google Cloud | Google Cloud の Buildpack
必要ファイルの用意
今回の作業では、Python のコードが実行される単純なコンテナイメージを作ってみます。
以下のディレクトリ構成で、必要となる各種ファイルを用意します。
. ├── app │ └── main.py ├── project.toml └── requirements.txt
app/main.py
簡単な Python スクリプトを作成します。
import argparse import sys import google.cloud.storage if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--message", type=str, default=None) args = parser.parse_args() print(f"python version: {sys.version}") print(f"google.cloud.storage version: {google.cloud.storage.__version__}") print(f"message: {args.message}")
project.toml
ルートディレクトリに project.toml
という toml ファイルを用意します。コンテナビルド時に、このファイルが参照されることになります。
[[build.env]] name = "GOOGLE_PYTHON_VERSION" value = "3.10.11" [[build.env]] name = "GOOGLE_ENTRYPOINT" value = "python -m app.main --message $message"
[[build.env]]
セクションの name 値に変数名を、value 値にその変数で設定したい値を記述します。各プログラム言語毎に設定できる変数名が決められており、Python の場合、GOOGLE_PYTHON_VERSION
が利用する Python のバージョンを、GOOGLE_ENTRYPOINT
がコンテナの ENTRYPOINT を指定できるものになります。今回の例では、$message
という変数を受け取れるようしています。
Google Cloud | 環境変数を使用してアプリケーションをビルドする
requirements.txt
インストールしたいライブラリを、requirements.txt
に記載しておきます。
google-cloud-storage==2.9.0
ルートディレクトリに requirements.txt
を用意しておくと、ビルド時に Buildpacks 側で pip install してくれます。
Google Cloud | pip を使用した依存関係の指定
コンテナのビルド/実行
では、ビルドして、コンテナを実行してみます。
ビルド
コンテナビルドの実行環境は、Cloud Build となります。Cloud Build 側でビルドしてくれたイメージは、Artifact Registry に push されるため、事前に Artifact Registry へリポジトリを作成しておきます。
$ gcloud artifacts repositories create sample-buildspack \ --repository-format=docker \ --location=asia-northeast1 \ --description="sample"
gcloud artifacts repositories create
上記作成したディレクトリのルートディレクトリに移動し、gcloud builds submit
コマンドを実行します。--pack
オプションを付与することで、Buildpacks を利用してビルドしてくれます。
$ gcloud builds submit --pack \ builder=gcr.io/buildpacks/builder:google-22,\ image=asia-northeast1-docker.pkg.dev/kawata-atsushi/sample-buildspack/app
builder
キーを利用して、利用したいビルダーを指定することができます(上のコマンドでは gcr.io/buildpacks/builder:google-22
を指定しています)。ビルダーとは、ビルド時に利用されるイメージ、みたいなものでしょうか。Google 側で何種類かのビルダーを用意してくれています。ビルダーの種類毎に、コンテナのベースイメージにあたる OS や、利用可能なプログラミング言語のバージョンが異なってきます。
実行
コンテナを実行してみます。まずは、Artifact Registry からローカルにイメージを pull してきます。
$ gcloud auth configure-docker asia-northeast1-docker.pkg.dev $ docker pull asia-northeast1-docker.pkg.dev/PROJECT-ID/sample-buildspack/app:latest
実行します。--env
オプションにて、message
という環境変数を渡しています。
$ docker run -it --rm --name app --env "message=hello" asia-northeast1-docker.pkg.dev/PROJECT-ID/sample-buildspack/app:latest python version: 3.10.11 (main, Apr 6 2023, 04:37:00) [GCC 11.3.0] google.cloud.storage version: 2.9.0 message: hello
想定通りのバージョンにてコンテナが作成されており、message
変数で渡した値を、Python の実行引数として受け取ってくれています。
その他参考資料
以下は Google 側で用意してくれているサンプルコードです。
GitHub | GoogleCloudPlatform/buildpack-samples/sample-python/
(当然ではありますが、)Buildpacks そのものに関しては、CNCF 提供のページが詳しいです。